package com.sx.entity.system;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sx.basic.BasicEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.List;

/**
 * @author AdinZ
 * @date 2020/11/7 10:15
 * 配置表主要数据是由开发人员输入到数据库中的
 * 此表与{@linkplain ConfigGroupEntity 表关联 属于子表}
 */
@Data
@NoArgsConstructor
@TableName(value = "sx_config")
@Entity
@Table(name = "sx_config")
public class ConfigEntity extends BasicEntity {
    @TableId(type = IdType.ASSIGN_ID)
    @Id
    @GeneratedValue
    private Long id;
    /**
     * 配置变量类型
     */
    @ApiModelProperty(value = "配置变量类型",allowableValues = "[STRING,INTEGER,FLOAT,BOOLEAN,TEXTAREA,HTML,JSON]")
    @Enumerated(value = EnumType.STRING)
    private Type type;
    /**
     * 关联{@linkplain ConfigGroupEntity#getGroupKey()} ()} 分组
     */
    @ApiModelProperty("配置组名称")
    private String groupKey;
    /**
     * 配置变量名称
     */
    @TableField("_key")@Column(name = "_key")
    @ApiModelProperty("配置变量键,相同配置组不能重复")
    private String key;
    /**
     * 配置变量值 泛类型, 根据{@linkplain Type 类型区分}
     */
    @TableField("_value")
    @Column(name = "_value",columnDefinition = "text")
    @ApiModelProperty("配置变量值")
    private String value;
    /**
     * 配置变量说明
     */
    @ApiModelProperty("配置变量说明")
    private String label;
    /**
     * 配置变量备注
     */
    @ApiModelProperty("配置变量备注")
    private String remark;
    @ApiModelProperty("配置组内排序")
    private int sort;

    public enum Type{
        STRING,
        INTEGER,
        FLOAT,
        BOOLEAN,
        TEXTAREA,
        HTML,
        JSON,
        FILE,
        IMAGE,
        VIDEO
    }

    public Object getObjectValue() {
        if (value == null) {
            return null;
        }
        try {
            switch (this.type) {
                case FLOAT:
                    return Float.parseFloat(this.value);
                case BOOLEAN:
                    return Boolean.parseBoolean(this.value);
                case INTEGER:
                    return Integer.parseInt(this.value);
                case JSON: {
                    return JSON.parse(this.value);
                }
                default:
                    return this.value;
            }
        } catch (Exception e) {
            return this.value;
        }
    }

    /**
     * 配置组数据 转map
     * @param list
     * @return
     */
    public static JSONObject toMap(List<ConfigEntity> list){
        JSONObject map=new JSONObject();
        if(list==null||list.size()==0)return map;
        for (ConfigEntity e:list){
            map.put(e.getKey(),e.getObjectValue());
        }
        return map;
    }

}
